# -*- coding: utf-8 -*-
"""
-------------------------------------------------
   File Name：     data_model
   Description :
   Author :       Flyoung
   date：          2023/9/4
-------------------------------------------------
   Change Activity:
                   2023/9/4:
-------------------------------------------------
"""


class Job:
    def __init__(
            self,
            job_name,
            salary_upper_limit,
            salary_lower_limit,
            experience_upper_limit,
            experience_lower_limit,
            company_size_upper_limit,
            company_size_lower_limit,
            city_score,
            education_score,
            welfare_score,
            tech_score
    ):
        # 岗位名称
        self.job_name = job_name
        # 城市分数
        self.city_score = city_score
        # 学历分数
        self.education_score = education_score
        # 福利分数
        self.welfare_score = welfare_score
        # 技术分数
        self.tech_score = tech_score
        # 工资上限
        self.salary_upper_limit = salary_upper_limit
        # 工资下限
        self.salary_lower_limit = salary_lower_limit
        # 经验上限
        self.experience_upper_limit = experience_upper_limit
        # 经验下限
        self.experience_lower_limit = experience_lower_limit
        # 公司规模上限
        self.company_size_upper_limit = company_size_upper_limit
        # 公司规模下限
        self.company_size_lower_limit = company_size_lower_limit

    def get_job_features(self):
        """
        获取特征向量
        :return:
        """
        return [
            self.city_score,
            self.education_score,
            self.tech_score,
            self.welfare_score,
            self.salary_upper_limit,
            self.salary_lower_limit,
            self.experience_upper_limit,
            self.experience_lower_limit,
            self.company_size_upper_limit,
            self.company_size_lower_limit,
        ]

    def generate_label(self):
        """
        city_score（城市分数）和education_score（学历分数）对于工作的吸引力以及个人发展非常重要，
        因此它们分别被赋予更高的权重，以更好地反映工作的潜力。

        tech_score（技术分数）和welfare_score（福利分数）虽然也对工作的吸引力有所影响，
        但相对而言权重较低，因为它们的重要性不如城市和学历。

        salary_upper_limit（工资上限）和salary_lower_limit（工资下限）在工作选择中起着重要的作用，
        但是它们的权重较低，因为这些属性与具体的薪资水平相关。

        experience_upper_limit（经验上限）和experience_lower_limit（经验下限）
        以及company_size_upper_limit（公司规模上限）和company_size_lower_limit（公司规模下限）
        对工作的吸引力也有一定影响，但相对而言权重较低。
        """
        weights = {
            "city_score": 0.3,
            "education_score": 0.2,
            "tech_score": 0.1,
            "welfare_score": 0.1,
            "salary_upper_limit": 0.05,
            "salary_lower_limit": 0.05,
            "experience_upper_limit": 0.025,
            "experience_lower_limit": 0.025,
            "company_size_upper_limit": 0.025,
            "company_size_lower_limit": 0.025
        }

        total_score = 0
        for attr, weight in weights.items():
            if hasattr(self, attr):
                total_score += getattr(self, attr) * weight

        return total_score

    @staticmethod
    def from_dict(item: dict):
        return Job(
            item["job_name"],
            item["salary_upper_limit"],
            item["salary_lower_limit"],
            item["experience_upper_limit"],
            item["experience_lower_limit"],
            item["company_size_upper_limit"],
            item["company_size_lower_limit"],
            item["city_score"],
            item["total_education_score"],
            item["total_welfare_score"],
            item["total_tech_score"]
        )
